home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / C / LIB / UNIXLIB37B / !UnixLib37 / src / signal / c / sigaltstk < prev    next >
Text File  |  1996-11-09  |  2KB  |  63 lines

  1. /****************************************************************************
  2.  *
  3.  * $Source: /unixb/home/unixlib/source/unixlib37/src/signal/c/RCS/sigaltstk,v $
  4.  * $Date: 1996/10/30 22:04:51 $
  5.  * $Revision: 1.1 $
  6.  * $State: Rel $
  7.  * $Author: unixlib $
  8.  *
  9.  * $Log: sigaltstk,v $
  10.  * Revision 1.1  1996/10/30 22:04:51  unixlib
  11.  * Initial revision
  12.  *
  13.  ***************************************************************************/
  14.  
  15. static const char rcs_id[] = "$Id: sigaltstk,v 1.1 1996/10/30 22:04:51 unixlib Rel $";
  16.  
  17. /* Written by Nick Burrett, 27 August 1996.  */
  18.  
  19. #include <signal.h>
  20. #include <errno.h>
  21. #include <unixlib/sigstate.h>
  22. #include <sys/unix.h>
  23.  
  24. /* Specifies an alternate stack for use during signal handling.
  25.    When a signal is received by the process and its action
  26.    indicates that the signal stack is used, the system arranges
  27.    a switch to the currently installed signal stack while the
  28.    handler for that signal is executed.  */
  29.  
  30. int
  31. sigaltstack (const struct sigaltstack *stack,
  32.          struct sigaltstack *oldstack)
  33. {
  34.   struct unixlib_sigstate *ss = &__u->sigstate;
  35.  
  36.   if (stack->ss_size < MINSIGSTKSZ)
  37.     {
  38.       /* The size of the alternate stack was too small.  */
  39.       errno = ENOMEM;
  40.       return -1;
  41.     }
  42.   if (ss->signalstack.ss_flags & SA_ONSTACK)
  43.     {
  44.       /* Trying to disable a stack that is currently in use.  */
  45.       errno = EINVAL;
  46.       return -1;
  47.     }
  48.  
  49.   if (oldstack != NULL)
  50.     {
  51.       oldstack->ss_sp = ss->signalstack.ss_sp;
  52.       oldstack->ss_size = ss->signalstack.ss_size;
  53.       oldstack->ss_flags = ss->signalstack.ss_flags;
  54.     }
  55.   if (stack != NULL)
  56.     {
  57.       ss->signalstack.ss_sp = stack->ss_sp;
  58.       ss->signalstack.ss_size = stack->ss_size;
  59.       ss->signalstack.ss_flags = stack->ss_flags;
  60.     }
  61.   return 0;
  62. }
  63.